num=document.getElementById('num').value;
num2=document.getElementById('num2').value;
num3=num/num2;
num4=num%num2;
num5=num4/num2;
num6=num3-num5;
document.getElementById('result').innerHTML='בחרת לחלק את המספר '+num+' במספר '+num2+' ולמצוא שלם ושארית.<br />התוצאה היא '+num6+' עם שארית '+num4+'.';}

אז ככה. יש 2 תיבות טקסט, בתבנית של "num לחלק ל-num2".
אם הכנסתי מספר כלשהו בשניהם ולחצתי אנטר:
- נוצר משתנה בשם num3 שיהיה שווה ערך ל-num לחלק ל-num2.
- לאחר מכן נוצר משתנה בשם num4 שכולל את השארית של חילוק של num ב-num2 (נניח שזה היה 7 וחילקנו ב-2, השארית היא 1 והתוצאה 3).
- לאחר מכן, משתנה בשם num5 שמכיל את השארית הכוללת לחלק למה שחילקנו בו. (כלומר, נניח היה לנו 7, חילקנו ב-3, התוצאה הייתה 2 עם שארית 1. חילקנו את שארית 1 ל-3, כך ש-num5 מכיל שליש).
- נוצר משתנה בשם num6, שהוא התוצר הסופי שמכיל את תוצאת החילוק פחות השארית של עצמו.
- מוצג משתנה num6, שהוא התוצאה, ומשתנה num4 שהוא השארית.

נניח שהיה לנו 49 וחילקנו אותו ב-2, אז:
num=49
num2=2
num3=24.5
num4=1
num5=0.5
num6=24
כך שיוצא לנו נכון. 49 לחלק ל-2 (במטרה למצוא שלם ושארית) שווה 24 עם שארית 1.

(המטרה בכל זה היא שזה ישמש ככלי עזר להמרה מבסיס לבסיס, אבל זה לא משנה).

בקיצור, הבעיה.
הקלדתי 58 לחלק ל-12, וקיבלתי:
התוצאה היא 3.9999999999999996 עם שארית 10.

מה שאומר שיש בעיה. התוצאה אמורה להיות שלמה.

אשמח שתתקנו אותי במה טעיתי.

לחצו כאן בכדי להגיע לדמו.

תודה מראש. :)

19 תשובות

avatar ענה intval ב 09 לינואר 2012 #

num1 = "58"
num 2 = "12"
num 3 = 4.33333333


למה זה קורה? כי מחולקת פה מחרוזת במחרוזת.
כמה לדעתך יוצא לחקל "פרה" ב"מכונית" ?

כדי להפוך מחרוזת מספר יש להישתמש בפונקציה parseInt בצורה הבאה:
num1 = parseInt(num1, 10);
num 2 = parseInt(num2, 10);

שים לב לפרמטר השניה, זה בסיס ספירה. אתה בטח שמעת על זה שיש בסיס ספירה עשרוני, הרגיל, בסיס בינארי, אוקטאלי עוד מלא בסיסים שונים :)
אל תשכח אותו, אחרת תקבל תוצאה בבסיס 8.

ובונוס, כשמחלקים פרה במכונית המחשב מתרגם את האותיות לערכים המספריים שלהם ועושה חילוק עליהם, בגלל זה התוצה שאנחנו רואים.

avatar ענה משתמש_73747 ב 09 לינואר 2012 #

למען האמת, זה עבד לי כמו שצריך בכל מספר שכתבתי חוץ מ-58, שבו יוצא:
num: 58
num2: 12
num3: 4.833333333333333
num4: 10
num5: 0.8333333333333334
num6: 3.9999999999999996

ניסיתי גם עם ה-parseInt כפי שאמרת, לא עזר.

avatar ענה intval ב 09 לינואר 2012 #

טעות שלי. הכל עובד נכון.
הסיבה שאתה לא מקבל מספר שלם היא זה, שהמחשב מוגבל בזיכרון ובכמות הפסרות אחרי הנקוד העשרונית.
למספר 4.8333 אין אין סוף ספרות 3 אחרי הנקודה, לכן המחשב מעגל את זה ל 48334 אחרי כמה פעמים של שלוש.
למספר 3.99999 יש אין סוף ספרות 9 בסוף, לכן המחש מעגל את זה ל 3.9990
ואז בחיסור אתה מקבל בסוף משהו עם 6.
למה אחד הוא מעגל למעלה ולמה אחד למעטה או לאיזה כיוון הוא יעגל את המספר אני כרגע לא יודע בוודאות. אני יבדוק את זה ויוסיף לפה ביומיים שלושה הקרובים עוד תשובה.

בינתיים לקבל את המספר השלם מתוצאת חילוק אפשר עם

alert(parseInt(58/12, 10))

avatar ענה משתמש_73747 ב 09 לינואר 2012 #

אחכה לתשובתך, תודה רבה לך. :)
ואגב, אמרת לקבל את המספר השלם בעזרת מה שכתבת? זה לאו דווקא שלם, יכול להיות גם עם נקודה עשרונית...

avatar ענה intval ב 09 לינואר 2012 #

המטרה הסופית של האלגוריטם שלך הוא לקבל את מספר השלם, לא ?
בכל אופן, אני יבדוק לפי מה המחשב מחליט לאן לעגל את המספר.

avatar ענה משתמש_73747 ב 09 לינואר 2012 #

מספר שלם ושארית (שהם נכונים). :)

avatar ענה intval ב 09 לינואר 2012 #

alert(parseInt(58/12, 10) + " " + (58%12) )

avatar ענה משתמש_73747 ב 09 לינואר 2012 #

נכון, אבל זה לא מחזיר לי מספר שלם...
58/12=4.833333333333333

avatar ענה intval ב 10 לינואר 2012 #

כי התוצאה היא לא מספר שלם. אם אתה רוצה רק את החלק השלם - תשתמש ב parseInt

avatar ענה משתמש_77356 ב 10 לינואר 2012 #

אני חושש שיש לי מחסור חמור בידע בסיסי במתמטיקה. אז אין סיכוי שעיגול כלפי מטה יביא תוצאה לא נכונה?

והאם הקוד הבא בסדר? (והאם בכלל יש צורך במשפט התנאי? ולמה הוא עבד ב58/12, ולא החזיר לי את השגיאה שכתבתי בתנאי - בניגוד לבעיות הקודמות איתו והנקודה הצפה?):

function blabla() {
num=document.getElementById('num').value;
num2=document.getElementById('num2').value;
num3=num/num2;
num4=Math.floor(num3);
num5=num%num2;
num6=num5/num2;
num7=num6+num4;
if (num7!=num3) {
document.getElementById('result').innerHTML='בחרת לחלק את המספר '+num+' במספר '+num2+' ולמצוא שלם ושארית.<br />התוצאה היא '+num4+' עם שארית '+num5+'.<br /><span style="color: red">יש חשש שהפיתרון שיצא לך שגוי.</sapn>';
}
else{
document.getElementById('result').innerHTML='בחרת לחלק את המספר '+num+' במספר '+num2+' ולמצוא שלם ושארית.<br />התוצאה היא '+num4+' עם שארית '+num5+'.';}
}

avatar ענה intval ב 10 לינואר 2012 #

אין לי שמץ של מושג מה אתה מנסה לעשות עם הקוד הזה, אבל הראתי לך פעממים כבר איך לקבל את השלם מפעולת חילוק ואיך לקבל את השאית, כל אחד בנפרד.

avatar ענה משתמש_77356 ב 10 לינואר 2012 #

המטרה היא שנניח יש לך 983 בבסיס עשרוני ואתה רוצה להמיר אותו להקסדצימלי ואתה רוצה להשתמש בשיטה המסוימת הזו, שאתה עושה:
983 לחלק ל-16.
61 עם שארית 7. 7.
61 לחלק ל-16.
3 עם שארית 13. D7.
0 עם שארית 3. 3D7.
3D7 בהקסדצימלי באמת מייצג 983 בעשרוני.

עקרונית, זה נועד עבור סוג של הסבר למעבר בין בסיסים. (כי אחרי הכל, לא כולם יכולים לחלק תוך שנייה מספר ב-16 ולמצוא שלם ושארית, בניגוד לחילוק ב-2 עבור בסיס בינארי).

avatar ענה intval ב 11 לינואר 2012 #

בסדר גמור. אני יאמר עוד פעם. זה הקוד למצוא שארית ושלם מחילוק של שני ספרות ממה שאתה רוצה, במה שאתה רוצה:

num1 = 58;
num2 = 12;
alert(' השלם ' + parseInt(num1 / num2, 10));
alert('שארית' + (num1%num2));

avatar ענה משתמש_78388 ב 11 לינואר 2012 #

parseInt תמיד יעגל כלפי מטה?

בכל מקרה, כתבתי קוד שעובד כמו שצריך:

num1=parseInt(document.getElementById('num1').value, 10);
num2=parseInt(document.getElementById('num2').value, 10);
num3=num1/num2;
num3=Math.floor(num3);
num4=num1%num2;
document.getElementById('result').innerHTML='בחרת לחלק את המספר '+num1+' במספר '+num2+' ולמצוא שלם ושארית.<br />התוצאה היא '+num3+' עם שארית '+num4+'.';

avatar ענה משתמש_78388 ב 11 לינואר 2012 #

אני חייב לשים שם את ה-parseInt? הוא הורס אם יש, נניח, 0.

avatar ענה intval ב 11 לינואר 2012 #

אם יש 0 איפה? אצלי הוא עובד גם עם 0.
אם אתה מדבר על, נגיד, 0123 ? אז זה כבר רישום בבסיס ספירה אוקטאלי.
באופן כללי, הוא רצוי, אבל לא חובה. יעבוד גם בלעדיו.

avatar ענה משתמש_79245 ב 12 לינואר 2012 #

אוקיי, תודה. :)

ואם נניח:
"בחרת לחלק את המספר 123 במספר 0 ולמצוא שלם ושארית.
התוצאה היא Infinity עם שארית NaN."

איך הוא הגיע למספר אין סופי ולמשהו שהוא לא מספר?

avatar ענה intval ב 12 לינואר 2012 #

ыמה התוצאה שהיית מצפה לקבל? :)
הוא עושה חילוק במספר "ששואף לאפס" (lim -> 0) ואתה מקבל אינסוף
השארית בהתאם.
בכל אופן תבדוק שמזינים לך משהו ששונה מאפס. חילוק ב 0 זה פעולה אסורה. יכול להיות שדפדנים אחרים בכלל עפים עם שגיאה באותו מקום.

avatar ענה משתמש_79245 ב 12 לינואר 2012 #

השועל, כרום, וזה-שאין-לנקוב-בשמו החזירו לי את אותו הדבר. :)

שוב תודה XD